package com.itheima.user.controller;

import com.itheima.sh.entity.OrderEntity;
import com.itheima.sh.entity.UserEntity;
//import com.itheima.sh.feign.OrderFeign;
import com.itheima.sh.feign.order.OrderFeign;
import com.itheima.sh.vo.request.AddOrderVO;
import com.itheima.sh.vo.response.OrderResultVO;
import com.itheima.sh.vo.response.ResultVO;
import com.itheima.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;


import javax.servlet.http.HttpServletRequest;
import java.util.List;

@RestController
@RequestMapping("/user")
//@CrossOrigin  // 允许所有的前端都可以跨域（不推荐）
public class UserController {

    @Autowired
    private UserService userService;

    //用户登录
    @GetMapping("/login/{userName}/{password}")
    public ResultVO login(@PathVariable("userName") String userName, @PathVariable("password") String password) {
        boolean loginResult = userService.login(userName, password);
        ResultVO result = new ResultVO();
        if (loginResult) {
            result.setSuccess(true);
        } else {
            result.setSuccess(false);
        }
        return result;
    }

    @Autowired
    private RestTemplate restTemplate;

    //eureka注入的依赖
    @Autowired
    DiscoveryClient discoveryClient;
//
//   @Autowired
//   OrderFeign orderFeign;// 基于JDK动态代理，获取到url 发起远程调用， 动态代理对象存到 IOC容器

    //查询用户订单信息
    @GetMapping("/findUserOrders/{userId}")
    public OrderResultVO findUserOrders(@PathVariable("userId") Integer userId, HttpServletRequest request) {

        UserEntity userEntity = userService.findUserById(userId);
        //todo 查询当前用户的订单列表

        /**
         * @Description: 1.远程调用第一种方法：基于restTemPlate的远程调用
         * @return: org.springframework.web.client.RestTemplate
         * @Author: LiJianBin
         * @Date: 2021/7/6 17:12
         **/
//        String url = "http://localhost:9001/order/findOrderInfoByUserId/"+userId;
         //发起远程调用 这里getForObject 前面的get...要与远程调用的请求相一致 或post 或delete。。。
        //这里的List是因为远程调用方法返回的是list
//        List list = restTemplate.getForObject(url, List.class);


        /**
         * 基于restTemPlate有以下问题：
         * 1、IP和端口号 硬编码问题
         * 2、服务请求路径 硬编码问题
         * 3、存在高并发不可用问题， 不能负载均衡调用服务的提供方
         */

        // 1、解决：IP和端口号 硬编码问题   利用注册中心 根据 order-service 拉取服务对应的 IP和PORT

        /**
         * @Description: 远程调用第二种方法：基于eureka的远程调用:最后一步
         * @param userId:
         * @param request:
         * @return: com.itheima.sh.vo.response.OrderResultVO
         * @Author: LiJianBin
         * @Date: 2021/7/6 18:01
         **/
        List<ServiceInstance> instances = discoveryClient.getInstances("ORDER-SERVICE");
        ServiceInstance serviceInstance = instances.get(0);  // 服务实例对象 0 代表注册到eureka注册中心的服务端第几个 0代表的是第一个
        String host = serviceInstance.getHost(); // IP 主机
        int port = serviceInstance.getPort();// PORT 端口
        String url = "http://" + host + ":" + port + "/order/findOrderInfoByUserId/" + userId;
//        List list = restTemplate.getForObject(url, List.class);

        // 3、解决：存在高并发不可用问题， 不能负载均衡调用服务的提供方
        // 负载均衡算法：默认是 轮询
//        String url = "http://order-service/order/findOrderInfoByUserId/" + userId;
        List list = restTemplate.getForObject(url, List.class);


        //2、解决：服务请求路径 硬编码问题，  面向接口的远程调用
//        List<OrderEntity> list = orderFeign.findOrderInfoByUserId(userId);


        //网关取出请求头
//        String company = request.getHeader("company");

        //封装参数
        OrderResultVO orderResultVO = OrderResultVO.builder()
                .userName(userEntity.getUserName())
                .orderList(list).build();

//        String str = orderFeign.findAll();
//        System.out.println(str);


//        String company = request.getHeader("company");
//        System.out.println(company);

        return orderResultVO;
    }

    //添加订单
    @PostMapping("/addUserOrder")
    public ResultVO addUserOrder(@RequestBody AddOrderVO addOrderVO) {
        ResultVO result = new ResultVO();
        //判断用户是否存在
        UserEntity userEntity = userService.findUserById(addOrderVO.getUserId());
        if (userEntity == null) {
            result.setSuccess(false);
            return result;
        }

        //todo

        return result;
    }
}
